package com.apps.java.javanote02;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class _22集合_Map {
    /**
     * Map
     *
     * 	一、概述
     * 		Interface Map<K,V>：K：键的类型	V:值的类型
     * 		将键映射到值的对象；不能包含重复的键；每个键可以映射到最多一个值
     * 		举例：学生的学号和姓名
     * 			01000	蔡徐坤
     * 			02000	乔碧罗
     * 			03000	蔡萝莉
     *
     * 	二、创建集合对象
     * 		创建Map集合的对象
     * 		1.多态的方式
     * 		2.具体的实现类HashMap
     *
     * 	三、基本功能
     * 		方法名									说明
     * 		V put(k key,V value)					添加元素
     * 		V remove(Object key)					根据键删除键值对元素
     * 		void clear()							移除所有的键值对元素
     * 		boolean containsKey(Object value)		判断集合是否包含指定的键
     * 		boolean containsValue(Object value)		判断集合是否包含指定的值
     * 		boolean isEmpty()						判断集合是否为空
     * 		int size()								集合的长度，也就是集合中键值对的个数
     *
     * 	四、获取功能
     * 		方法名							说明
     * 		V get(Object key)：				根据键获取值
     * 		Set<K> keySet()：				获取所有键的集合
     * 		Collection<V> values()：			获取所有值的集合
     * 		Set<Map.Entry<K,V>> entrySet()	获取所有键值对对象的集合
     *
     * 	五、集合的遍历
     *		1.方式一：
     *			（1）获取所有键的集合。用keySet()是实现
     *			（2）遍历键的集合，获取到每个键。用增强for实现
     *			（3）根据键去找值。用get(Object key)实现
     *		2.方式二：
     *			（1）获取所有键值对对象的集合
     *				Set<Map.Entry<K,V>> entrySet()：获取所有键值对对象的集合
     *			（2）遍历键值对对象的集合，得到每一个键值对对象
     *				用增强for实现，得到每一个Map.Enrty
     *			（3）根据键值对对象获取键和值
     *				getKey()获取键
     *				getValue()获取值
     *
     */
    public static void main(String[] args) {

        //创建集合对象
        Map<String,String> map = new HashMap<String,String>();

        //添加元素：V put(K key,V value)将指定的值与该映射中的指定键相关联
        map.put("01000", "蔡徐坤");
        map.put("02000", "乔碧罗");
        map.put("03000", "蔡萝莉");
        map.put("03000", "李小璐");//map中保证键唯一，如果有同样的键，那么会覆盖掉之前的值

        System.out.println("map集合中的元素：" + map);

        //V remove(Object key)根据键删除键值对元素
        System.out.println("删除的键值对元素是：" + map.remove("03000"));
        System.out.println("删除后的集合：" + map);

        //void clear()移除所有的键值对元素
        map.clear();
        System.out.println("移除后的集合：" + map);

        //boolean isEmpty()判断集合是否为空
        System.out.println("集合是否为空：" + map.isEmpty());

        map.put("01000", "蔡徐坤");
        map.put("02000", "乔碧罗");
        map.put("03000", "蔡萝莉");
        map.put("03000", "李小璐");
        System.out.println("map集合中的元素：" + map);

        //boolean containsKey(Object value)判断集合是否包含指定的键
        System.out.println("集合中是否包含指定的键：" + map.containsKey("03000"));

        //boolean containsValue(Object value)判断集合是否包含指定的值
        System.out.println("是否包含指定的值：" + map.containsValue("蔡萝莉"));

        //int size()集合的长度，也就是集合中键值对的个数
        System.out.println("集合的长度为：" + map.size());

        //V get(Object key)：根据键获取值
        System.out.println("获取到的值是：" + map.get("01000"));
        System.out.println("获取到的值是：" + map.get("05000"));

        //Set<K> keySet()：获取所有键的集合
        Set<String> keySet = map.keySet();
        System.out.print("获得所有键的集合：" );
        for(String s : keySet){
            System.out.print( s + " ");
        }

        System.out.println();

        //Collection<V> values()：获取所有值的集合
        Collection<String> values = map.values();
        System.out.print("获得所有值的集合：");
        for(String s : values){
            System.out.print(s + " ");
        }
        System.out.println();

        //Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        System.out.print("获取所有键值对对象的集合：");
        for(Map.Entry<String, String> s : entrySet){
            System.out.print(s + " ");
        }

        System.out.println();

        //集合遍历
        //方式一：
        //获取所有键的集合
        Set<String> keySet2 = map.keySet();
        //遍历键的集合
        System.out.print("集合遍历方式1：");
        for(String s : keySet2){
            String string = map.get(s);
            System.out.print(s + "," + string + "\t");
        }

        System.out.println();

        //方式二：
        //获取所欲键值对对象的集合
        Set<Map.Entry<String,String>> entrySet2 = map.entrySet();
        //遍历键值对对象
        System.out.print("集合遍历方式2：");
        for(Map.Entry<String, String> s : entrySet2){
            System.out.print(s.getKey() + "," + s.getValue() + "\t");
        }

    }
}
